package com.coolading.base.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public abstract interface BaseService {

	/**
	 * save(保存对象)
	 * 
	 * @Title: save
	 * @author chenqi
	 * @param paramObject
	 *            对象
	 * @return Serializable 返回类型
	 * @throws
	 */
	public abstract Serializable save(Object paramObject);

	/**
	 * update(保存对象)
	 * 
	 * @Title: update
	 * @author chenqi
	 * @param paramObject
	 *            对象
	 * @return Serializable 返回类型
	 * @throws
	 */
	public abstract void update(Object paramObject);

	/**
	 * delete(删除对象)
	 * 
	 * @Title: delete
	 * @author chenqi
	 * @param paramObject
	 *            对象
	 * @return void 返回类型
	 * @throws
	 */
	public abstract void delete(Object paramObject);

	/**
	 * deleteAll(删除对象集合)
	 * 
	 * @Title: deleteAll
	 * @author chenqi
	 * @param paramList
	 *            对象集合
	 * @return void 返回类型
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	public abstract void deleteAll(List paramList);

	/**
	 * saveOrUpdate(保存或修改对象)
	 * 
	 * @Title: saveOrUpdate
	 * @author chenqi
	 * @param paramObject
	 *            对象
	 * @return void 返回类型
	 * @throws
	 */
	public abstract void saveOrUpdate(Object paramObject);

	/**
	 * saveAll(保存对象集合)
	 * 
	 * @Title: saveAll
	 * @author chenqi
	 * @param paramList
	 *            对象集合
	 * @return void 返回类型
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	public abstract void saveAll(List paramList);

	/**
	 * updateAll(修改对象集合)
	 * 
	 * @Title: updateAll
	 * @author chenqi
	 * @param paramList
	 * @return void 返回类型
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	public abstract void updateAll(List paramList);

	/**
	 * findById(根据主键查询对象)
	 * 
	 * @Title: findById
	 * @author chenqi
	 * @param paramClass
	 * @param paramSerializable
	 *            主键
	 * @return Object 返回类型
	 * @throws
	 */
	public abstract <T> T findById(Class<T> paramClass,
			Serializable paramSerializable);

	/**
	 * execUpdateHql(根据hql语句修改)
	 * 
	 * @Title: execUpdateHql
	 * @author chenqi
	 * @param hql
	 * @return
	 * @return int 返回类型
	 * @throws
	 */
	public abstract int execUpdateHql(String hql);

	/**
	 * execUpdateSql(根据hql语句修改)
	 * 
	 * @Title: execUpdateSql
	 * @author chenqi
	 * @param sql
	 * @return
	 * @return int 返回类型
	 * @throws
	 */
	public abstract int execUpdateSql(String sql);

	/**
	 * findByHql(根据hql查询对象集合)
	 * 
	 * @Title: findByHql
	 * @author chenqi
	 * @param hql
	 * @return
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByHql(String hql);

	/**
	 * findBySql(根据sql查询对象集合)
	 * 
	 * @Title: findBySql
	 * @author chenqi
	 * @param hql
	 * @return
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findBySql(String sql);
	
	/**
	 * findBySqlAndClass(根据sql、类查询实体list集合)
	 * @author chenqi
	 * @date 2014年7月24日 下午7:19:50
	 * @param sql
	 * @param cl
	 * @return
	 */
	public <T> List<?> findBySqlAndClass(String sql,Class<T> cl);

	/**
	 * findByHql(根据hql查询size条对象集合)
	 * 
	 * @Title: findByHql
	 * @author chenqi
	 * @param hql
	 * @param size
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByHql(String hql, int size);

	/**
	 * findByHql(根据hql分页查询对象集合)
	 * 
	 * @Title: findByHql
	 * @author chenqi
	 * @param hql
	 * @param currSize
	 *            当前条数
	 * @param pageSize
	 *            查询条数
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByHql(String hql, int currSize, int pageSize);

	/**
	 * findByNamedParam(根据一个条件的hql查询对象集合信息)
	 * 
	 * @Title: findByNamedParam
	 * @author chenqi
	 * @param hql
	 * @param paramString
	 *            参数名
	 * @param paramObject
	 *            参数值
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByNamedParam(String hql, String paramString,
			Object paramObject);

	/**
	 * findByNamedParam(根据一个条件的hql查询对象集合信息返回size条信息)
	 * 
	 * @Title: findByNamedParam
	 * @author chenqi
	 * @param hql
	 * @param paramString
	 *            参数名
	 * @param paramObject
	 *            参数值
	 * @param size
	 *            条数
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByNamedParam(String hql, String paramString,
			Object paramObject, int size);

	/**
	 * findByNamedParam(根据多个条件的hql查询对象集合信息)
	 * 
	 * @Title: findByNamedParam
	 * @author chenqi
	 * @param hql
	 * @param paramArrayOfString
	 *            数组参数名
	 * @param paramArrayOfObject
	 *            数组参数值
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByNamedParam(String hql,
			String[] paramArrayOfString, Object[] paramArrayOfObject);

	/**
	 * findByNamedParam(根据多个条件的hql查询对象集合信息返回size条信息)
	 * 
	 * @Title: findByNamedParam
	 * @author chenqi
	 * @param hql
	 * @param paramArrayOfString
	 *            数组参数名
	 * @param paramArrayOfObject
	 *            数组参数值
	 * @param size
	 *            条数
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findByNamedParam(String paramString,
			String[] paramArrayOfString, Object[] paramArrayOfObject, int size);


	/**
	 * evict(会把指定的缓冲对象进行清除)
	 * 
	 * @Title: evict
	 * @author chenqi
	 * @param paramClass
	 * @param paramSerializable
	 *            序列id
	 * @return void 返回类型
	 * @throws
	 */
	public abstract <T> void evict(Class<T> paramClass, Serializable paramSerializable);

	/**
	 * flush(可以强制进行从内存到数据库的同步)
	 * 
	 * @Title: flush
	 * @author chenqi
	 * @return void 返回类型
	 * @throws
	 */
	public abstract void flush();

	/**
	 * findMapBySql(根据sql查询map)
	 * 
	 * @Title: findMapBySql
	 * @author chenqi
	 * @param sql
	 * @return Map 返回类型
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	public abstract Map findMapBySql(String sql);

	/**
	 * findKeyMapBySql(根据sql查询key value模式map)
	 * 
	 * @Title: findKeyMapBySql
	 * @author chenqi
	 * @param sql
	 * @return Map 返回类型
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	public abstract Map findKeyMapBySql(String sql);

	/**
	 * findListMapBySql(根据sql查询map集合)
	 * 
	 * @Title: findListMapBySql
	 * @author chenqi
	 * @param sql
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findListMapBySql(String sql);

	/**
	 * getPageVO(根据条件hql分页查询对象信息)
	 * 
	 * @Title: getPageVO
	 * @Description: TODO
	 * @param @param hql
	 * @param @param begin
	 * @param @param rows
	 * @param @param paramValue
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> getPageVO(String hql, int begin, int rows,
			Object[] paramValue);

	/**
	 * getPageTotalVO(根据条件hql查询对象信息)
	 * 
	 * @Title: getPageTotalVO
	 * @author chenqi
	 * @param hql
	 * @param paramValue
	 * @return
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> getPageTotalVO(String hql, Object[] paramValue);

	/**
	 * callProcBySql(存储过程)
	 * 
	 * @Title: callProcBySql
	 * @author chenqi
	 * @param hql
	 * @param paramValue
	 * @return
	 * @return List 返回类型
	 * @throws
	 */
	public abstract int callProcBySql(String sql, Object[] paramValue);
	
	
	/**
	 * findAllByPageAndPageSize(根据对象名、页数、当前条数获取分页集合)
	 * @author chenqi
	 * @date 2014年7月10日 下午8:21:03
	 * @param className
	 * @param currPage
	 * @param pageSize
	 * @return
	 */
	public abstract Map<String,Object> findAllByPageAndPageSize(String className,int currPage,int pageSize); 
	
	/**
	 * findAll(查询所有)
	 * @author chenqi
	 * @date 2014年7月10日 下午8:33:10
	 * @param className
	 * @return
	 */
	public abstract List<?> findAll(String className);
	
	/**
	 * findPageTotalCount(查询分页总数)
	 * @author chenqi
	 * @date 2014年7月11日 上午9:27:04
	 * @param hql
	 * @return
	 */
	public abstract int findPageTotalCount(String hql);
	
	/**
	 * findByNamedParam(根据多个条件的hql查询对象集合信息返回size条信息)
	 * 
	 * @Title: findByNamedParam
	 * @author chenqi
	 * @param hql
	 * @param paramArrayOfString
	 *            数组参数名
	 * @param paramArrayOfObject
	 *            数组参数值
	 * @param minSize 最小条数
	 * 
	 * @param maxSize 最大条数
	 *            
	 * @return List 返回类型
	 * @throws
	 */
	public abstract List<?> findBySqlAndNamedParam(String paramString,
			String[] paramArrayOfString, Object[] paramArrayOfObject, int minSize,int maxSize);
}